package 已经做过的笔试题;

/**
 * @Date 2024/9/24 22:12
 * @description: 招商银行： 移动0
 * .
 * @Author LittleNight
 */
public class likou283 {

    public void moveZeroes(int[] nums) {
        // 这是典型的数组分块，根据一个规则把数组分成两块, 我们用到双指针,
        // 同时也是 快排的核心思想，数据划分
        // -1 的原因是刚开始 right 还没扫描 0，注意这个细节
        // -1 是因为left 表示的是一扫描过的区间内， 非零元素的最后一个位置
        // 注意分两块: 当数据量都一样的时候, 逼近 n^2
        int left = -1;
        for(int right = 0; right < nums.length; right++) {
            if(nums[right] == 0) {
                // 遇到0，不做处理直接向后移动
                // right++;
            }else {
                // 遇到非0，交换 left + 1 和 right,同时两个指针向后移动
                int tmp = nums[left + 1];
                nums[left + 1] = nums[right];
                nums[right] = tmp;

                // right++; for循环里有了
                left++;
            }
        }
    }
}
